from itertools import product
from re import A
from typing import override
from rest_framework import serializers
from rest_framework.serializers import ModelSerializer
from product.models import Product, Review


# 先序列化评论
class ReviewModelSerializer(ModelSerializer):
    class Meta:
        model = Review
        fields = ["id", "comment", "username"]

# 通用序列化器#
class ProductModelSerializer(ModelSerializer):
    # 关联的评论模型序列化器，原因：查查询外键关联的字段，需要关联的模型的序列化器
    # 有的字段只能读取，不能写入，所以要指定字段的只读(read_only)/只写(wirte_only)属性
    review_set = ReviewModelSerializer(many=True, read_only=True, )

    # 只返回PrimaryKeyRelatedField的主键值，而不是整个对象
    # review_set = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    # 自定义字段
    add_stock = serializers.SerializerMethodField()
    class Meta:
        # 指定要序列化的模型
        model = Product
        # 指定要序列化的字段
        # fields= "__all__" 返回所有的字段
        # 列表中指定要序列化的字段
        fields= ['id', 'product_name', 'cover', 'price', 'stock', 'is_active', 'review_set', 'add_stock']
        # 排序指定序列化字段
        # exclude = ['product_name']
        
        # 添加额外参数 在保存或者修改更新的时候触发
        extra_kwargs = {
            # min_value 最小的只，不能为负数
            'price': {'min_value': 0,
                    'required':True,
                    # 自定义错误信息
                    'error_messages': {
                        "min_value": "价格不能低于 0",
                        "required": "价格必须填写"
                    }
            },
       
            'stock': {'min_value': 0,
                'required':True,
                # 自定义错误信息
                'error_messages': {
                    "min_value": "库存不能低于 0",
                    "required": "库存必须填写"
                }
        },

        }
    def get_add_stock(self, obj):
        # obj 是当前的对象
        # 从当前的模型对象中导入自定义的方法，调用这个方法，返回结果
        return obj.add_stock()
    # validate_<field_name>
    # def validate_product_name(self, value):
    #     print(value)
    #     if Product.objects.filter(product_name=value).exists():
    #         raise serializers.ValidationError("商品名称不能重复")

    def validate_price(self, value):
        if value < 0.1:
            # ValidationError 是 rest_framework 提供的异常类 主要用于验证失败的时候抛出异常
            raise serializers.ValidationError("价格不能小于0.1")
        return value
    
    def validate(self, attrs):
        # attrs 是当前的所有的字段 包含所有字段的已验证值，这些值已经通过字段的基础验证(如类型检查、最大值、最小值等)
        # {'product_name': '小米yu17', 'price': Decimal('1.00'), 'stock': 1000, 'is_active': True}
        price = attrs.get('price')
        stock = attrs.get('stock')
        
        if price is not None and stock is not None and price * stock > 10000:
            raise serializers.ValidationError("价格和库存的乘积不能超过 10000")
        return super().validate(attrs)